﻿using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading;
using System.Windows.Forms;

namespace Administracja
{
    public partial class Aktualizacja : Form
    {
        private Thread _watek;
        private readonly WebClient _webClient = new WebClient();
        private readonly Version _aktualna;
        private readonly Version _appVersion = Version.Parse(Application.ProductVersion);

        public Aktualizacja()
        {
            InitializeComponent();

            try
            {
                _aktualna = Version.Parse(_webClient.DownloadString("https://administracja.googlecode.com/svn/tags/UpToDate/Version.txt"));

                aktVer.Text = "Aktualna wersja: " + _aktualna;
                posVer.Text = "Posiadana wersja: " + _appVersion;

                if (_aktualna.CompareTo(_appVersion) <= 0)
                {
                    stan.ForeColor = Color.Green;
                    stan.Text = "Posiadasz najnowszą\nwersję.";
                }
                else
                {
                    stan.ForeColor = Color.Red;
                    stan.Text = "Jest dostępna nowsza\nwersja";
                }
            }
            catch (WebException)
            {
                Wyjatki.Komunikat("Prawdopodobnie nie masz połączenia z internetem lub na serwerze nie znajduje się plik aktualizacji.", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                Wyjatki.Error(ex);
            }
        }

        private void ZamknijClick(object sender, EventArgs e)
        {
            try
            {
                _watek.Abort();
            }
            catch
            {
                Raport.Instance.Raportuj("Przerwano aktualizację.");
            }

            Close();
        }

        private void AktualizujClick(object sender, EventArgs e)
        {
            bool aktualizujF;


            if (_aktualna.CompareTo(_appVersion) <= 0)
            {
                aktualizujF = Wyjatki.Komunikat("Brak nowszej wersji na serwerze, czy na pewno chcesz próbować aktualizować?",
                    "Aktualizować?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes;
            }
            else
            {
                aktualizujF = true;
            }

            if (aktualizujF)
            {
                Process[] processes = Process.GetProcessesByName("Administracja");

                if (processes.Count() > 1)
                {
                    Wyjatki.Komunikat(
                        "Jest otwartych kilka programów \"Administracja\". Zamknij je i spróbuj ponownie.",
                        "Wiele instancji programu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    groupBoxPasek.Enabled = true;
                    stan.Text = "Pobieram aktualizacje";

                    _watek = new Thread(ThreadTask) { IsBackground = true };
                    _watek.Start();
                }
            }
        }

        private void ThreadTask()
        {
            Baza.CloseConnection();
            Thread.Sleep(2000);

            try
            {
                if (File.Exists("Baza//PUSTA.FDB")) File.Delete("Baza//PUSTA.FDB");
                OdswiezPasek(5);

                if (File.Exists("Baza//TESTY.FDB")) File.Delete("Baza//TESTY.FDB");
                OdswiezPasek(10);

                if (File.Exists("Update.exe")) File.Delete("Update.exe");
                OdswiezPasek(15);

                if (File.Exists("_Administracja.exe")) File.Delete("_Administracja.exe");
                OdswiezPasek(20);

                _webClient.DownloadFile("https://administracja.googlecode.com/svn/tags/UpToDate/Baza/PUSTA.FDB", "Baza//PUSTA.FDB");
                OdswiezPasek(40);

                _webClient.DownloadFile("https://administracja.googlecode.com/svn/tags/UpToDate/Baza/TESTY.FDB", "Baza//TESTY.FDB");
                OdswiezPasek(60);

                _webClient.DownloadFile("https://administracja.googlecode.com/svn/tags/UpToDate/Update.exe", "Update.exe");
                OdswiezPasek(80);

                _webClient.DownloadFile("https://administracja.googlecode.com/svn/tags/UpToDate/Administracja.exe", "_Administracja.exe");
                OdswiezPasek(100);

                Program.Zamykam = true;

                Process.Start("Update.exe");
                Application.Exit();
            }
            catch (IOException)
            {
                Wyjatki.Komunikat("Prawdopodobnie jakiś plik jest używany, uruchom program ponownie.", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
                OdswiezPasek(0);
            }
            catch (ThreadAbortException) { }
            catch (Exception ex)
            {
                Wyjatki.Error(ex);
                OdswiezPasek(0);
            }
        }

        private void OdswiezPasek(int proc)
        {
            pasek.Invoke(new Action(delegate()
            {
                pasek.Value = proc;
            }));
        }
    }
}
